﻿#ifndef __SS_SHADER_H__
#define __SS_SHADER_H__
#include "../ssObject.h"
#include "../opengl/ssOpenGLSupport.h"
#include "console/ssConsole.h"
#include "string/ssString.h"

namespace StarSeeker
{

class ssShader : public ssObject
{
	friend class ssShaderManager;
public:
	ssShader(const char* name);
	~ssShader();
	//释放资源
	void Unload();
	//编译顶点着色器
	bool CompileVertexShaderFromFile(const char* path);
	bool CompileVertexShader(const char* str, u32 strLen);
	//编译像素着色器
	bool CompilePiexlShaderFromFile(const char* path);
	bool CompilePiexlShader(const char* str, u32 strLen);
	//链接
	bool LinkShader();
	//使用
	void Use();
	//获取一致变量序号
	GLint GetUniformLocation(const char* name);
	//设置一致变量
	void SetUniformFloat(i32 id, const ssfloat* pf, u32 count);
	void SetUniformInt(i32 id, const i32* pi, u32 count);
	//count:传几个vec(非数组就是1)；vcount:每个vec有几个值;
	void SetUniformVector(i32 id, const ssfloat* pf, u32 count, u32 vcount);
	//count:传几个mat(非数组就是1)；mcount:每个mat是几X几;
	void SetUniformMatrix(i32 id, const ssfloat* pf, u32 count, u32 mcount);
	//设置纹理一致变量
	void SetUniformTextureLayer(i32 id, u8 layer);
	//获取属性变量序号
	GLint GetAttribLocation(const char* name);
	//不使用着色器
	static void NonuseShader();
	//获取程序对象句柄
	const u32 GetProgramHandle() {return m_programHandle;}
	//设置纹理一致变量
	//void SetTextureUniformVariables(u8 layer, const char* name);
private:
	bool CompileShader(GLuint h);
	bool CreateShaderProgram();
	void SetShaderSource(GLuint h, const char* str, u32 strLen);
private:
	GLuint					m_vertexHandle;	//顶点着色器句柄
	GLuint					m_piexlHandle;	//像素着色器句柄
	GLuint					m_programHandle;//程序对象句柄
	ssString				m_vertexText;
	ssString				m_piexlText;
};

}
#endif
